﻿using System;
using System.Collections.Generic;
using NHibernate;
using CRC.NHibernate;
using CRC.Inspecciones.Dominio.Clases;
using CRC.GestionSalones.Dominio.Clases;

namespace CRC.Inspecciones.Dominio.Controlador
{
    class ControladorNuevaHojaInspeccion
    {

        private static String strQryTiposHojas = "select th.Id, th.Codigo from TipoHojaInspeccion th";
        private static String strQryAnfitrionas = "select c.Salon.Id, c.NombreCRC from Congregacion c where c.EsAnfitriona=true order by c.NombreCRC";
        private static String strExisteHojaSalonParaAño = "from HojaInspeccion hi " +
                    "where hi.TipoImpreso=:tipoHoja and year(hi.Fecha)=:año "+
                    "and hi.SalonInspeccionado.Id=:idSalon";

        //public IList<Salon> VisualizarSalones()
        //{
        //    ISession session = null;
        //    ITransaction tx = null;
        //    IList<Salon> salones = null;

        //    try
        //    {

        //        session = NHibernateHelper.GetCurrentSession();
        //        tx = session.BeginTransaction();

        //        salones = session.CreateQuery("from Salon").List<Salon>();
        //        tx.Commit();

        //        return salones;

        //    }
        //    catch (HibernateException he)
        //    {
        //        if (tx != null) { tx.Rollback(); }
        //        if (session != null) session.Close();
        //        throw he;
        //    }
        //}

        public IList<Object[]> listarAnfitrionas() 
        {
            ISession session = null;
            IList<Object[]> salones = null;

            try
            {
                session = NHibernateHelper.GetCurrentSession();

                salones = (IList<Object[]>)session.CreateQuery(strQryAnfitrionas).List<Object[]>();
                return salones;
            }
            catch (HibernateException he)
            {
                if (session != null) session.Close();
                throw he;
            }
        }

        public IList<Object[]> listarTipoHojasInspeccion()
        {
            ISession session = null;
            IList<Object[]> tipoHojasInsp = null;

            try
            {
                session = NHibernateHelper.GetCurrentSession();

                tipoHojasInsp = session.CreateQuery(strQryTiposHojas).List<Object[]>();
                return tipoHojasInsp;

            }
            catch (HibernateException ex)
            {
                if (session != null) session.Close();
                throw ex;
            }
        }

        public Object[] nuevaHojaEnBlanco(String pStrTipoHoja, DateTime pFecha, int pIntSalon) 
        {

            ISession session = null;
            ITransaction tx = null;
            Object[] infoHoja = new Object[5];

            try 
            {
                session = NHibernate.NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                Salon s = (Salon)session.Get(typeof(Salon), pIntSalon);

                //pre: No existe hoja de este tipo para el año y salon
                IQuery qry = session.CreateQuery(strExisteHojaSalonParaAño);
                
                qry.SetParameter("tipoHoja", pStrTipoHoja);
                qry.SetParameter("año", pFecha.Year);
                qry.SetParameter("idSalon", s.Id);

                IList<HojaInspeccion> lst = qry.List<HojaInspeccion>();
                if (lst.Count > 0) throw new ApplicationException("Hoja de inspección ya añadida.");
                //fi pre

                //Nueva Hoja
                TipoHojaInspeccion tHoja = (TipoHojaInspeccion)session.Get(typeof(TipoHojaInspeccion), pStrTipoHoja);
                HojaInspeccion nuevaHojaInsp  = new HojaInspeccion(s, pFecha, tHoja);

                session.Save(nuevaHojaInsp);

                //String strEstado = String.Empty;
                //if (nuevaHojaInsp.TipoImpreso.Codigo.CompareTo("TO-34") == 0) 
                //{
                //    strEstado = "TO-341";
                //}
                //else if (nuevaHojaInsp.TipoImpreso.Codigo.CompareTo("S-105") == 0)
                //{
                //    strEstado = "S-105";
                //}
                //else if (nuevaHojaInsp.TipoImpreso.Codigo.CompareTo("INFO") == 0)
                //{
                //    strEstado = "EB";
                //}

                ////Registrar linea de seguimiento
                //EstadoLineaSeguimiento estadoLineaSeguimiento = (EstadoLineaSeguimiento)session.Get(typeof(EstadoLineaSeguimiento), strEstado);
                //LineaSeguimientoInspeccion lineaInspeccion = new LineaSeguimientoInspeccion(salon, DateTime.Today, estadoLineaSeguimiento);
                
                //session.Save(lineaInspeccion);

                infoHoja[0] = nuevaHojaInsp.Id;
                infoHoja[1] = nuevaHojaInsp.Fecha;
                infoHoja[2] = nuevaHojaInsp.TipoImpreso.Codigo;
                infoHoja[3] = nuevaHojaInsp.SalonInspeccionado.Zona.Nombre;
                infoHoja[4] = nuevaHojaInsp.SalonInspeccionado.Nombre_Salon;

                tx.Commit();
                return infoHoja;

            }
            catch (HibernateException he)
            {
                if (tx != null) { tx.Rollback(); }
                if (session != null) session.Close();
                throw he;
            }
        }
    }
}
